#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QDir>
#include <QFileDialog>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 下面这段用于设置File子页面中的布局和控件的位置
    ui->tabWidget->setFixedHeight(120);     // 设置QTabWidget控件的高度

    ui->FileHLayout->setAlignment(Qt::AlignLeft); // 把File子页面中的布局设计左对齐
    ui->FileHLayout->setAlignment(Qt::AlignTop);  // 把File子页面中的布局设计上对齐
    ui->FileHLayout->setContentsMargins(0,0,0,0);  // 设置布局与子页面四边的间距为0
    ui->FileHLayout->setSpacing(0);                // 设置布局中各控件之间的间距为0

    //  下面的代码，把在UI中添加的QToolButton控件与QAction动作连接起来
    ui->NewTB->setDefaultAction(ui->actionNew);
    ui->OpenTB->setDefaultAction(ui->actionOpen);
    ui->SaveTB->setDefaultAction(ui->actionSave);
    ui->SaveAsTB->setDefaultAction(ui->actionSaveAs);
    ui->ExitTB->setDefaultAction(ui->actionExit);

    ui->FileTab->setLayout(ui->FileHLayout);		// 通过本语句让布局布满Tab子页面

    //实现DrawTB子页面的按钮
    QHBoxLayout *drawHL1 = new QHBoxLayout;               // 我们先设计一个横排列的布局，用于排列绘图控件
    drawHL1->setAlignment(Qt::AlignLeft);					//  左对齐
    drawHL1->setAlignment(Qt::AlignTop);                       //  顶对齐
    drawHL1->setContentsMargins(0,0,0,0);				     //  四边距为0
    drawHL1->setSpacing(0);                                  //  内部控件间距为0

    // 下面这一段代码主要用于设计一个QToolButton类型的按钮控件，并把它添加到布局中
    QToolButton *pointTB = new QToolButton;                     // 第一个控件，画点
    pointTB->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);        // 控件样式设计为文本显示在图标下方
    pointTB->setFixedSize(QSize(100,72));                         // 指定图标的大小为 32x32 像素
    pointTB->setText("点");                                  // 同时也设置了控件的显示名称
    pointTB->setArrowType(Qt::NoArrow);                         // 设置为没有箭头显示
    const QIcon pointIcon = QIcon::fromTheme("Point", QIcon(":/icons/icons/Target1.ico")); //资源文件中图标
    pointTB->setIcon(pointIcon);                                // 把这个点的图标设置给QToolButton按钮
    connect(pointTB,&QToolButton::clicked,this,&MainWindow::pointTB_clicked); // 建立点击该按钮的槽函数的链接
    drawHL1->addWidget(pointTB);                                // 把这个按钮添加到布局中

    // 下面这一段代码主要用于设计一个画线的按钮控件，并把它添加到布局中
    QToolButton *lineTB = new QToolButton;                     // 第一个控件，画点
    lineTB->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);        // 控件样式设计为文本显示在图标下方
    lineTB->setFixedSize(QSize(100,72));                         // 指定图标的大小为 32x32 像素
    lineTB->setText("直线");                                  // 同时也设置了控件的显示名称
    lineTB->setArrowType(Qt::NoArrow);                         // 设置为没有箭头显示
    const QIcon lineIcon = QIcon::fromTheme("Line", QIcon(":/icons/icons/Line.ico")); // 资源文件中的图标
    lineTB->setIcon(lineIcon);                                // 把这个点的图标设置给QToolButton按钮
    connect(lineTB,&QToolButton::clicked,this,&MainWindow::lineTB_clicked);   // 建立点击该按钮的槽函数的链接
    drawHL1->addWidget(lineTB);                                // 把这个按钮添加到布局中
    // 最后，把DrawTab的布局设计成刚才创建的布局
    ui->DrawTab->setLayout(drawHL1);

    QToolButton *rectangleTB = new QToolButton;                     // 第一个控件，画点
    rectangleTB->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);        // 控件样式设计为文本显示在图标下方
    rectangleTB->setFixedSize(QSize(100,72));                         // 指定图标的大小为 32x32 像素
    rectangleTB->setText("矩形");                                  // 同时也设置了控件的显示名称
    rectangleTB->setArrowType(Qt::NoArrow);                         // 设置为没有箭头显示
    const QIcon RectangleIcon = QIcon::fromTheme("Rectangle", QIcon(":/icons/icons/Rectangle.ico")); // 资源文件中的图标
    rectangleTB->setIcon(RectangleIcon);                                // 把这个点的图标设置给QToolButton按钮
    connect(rectangleTB,&QToolButton::clicked,this,&MainWindow::rectangleTB_clicked);   // 建立点击该按钮的槽函数的链接
    drawHL1->addWidget(rectangleTB);    // 把这个按钮添加到布局中

    QToolButton *EllipseTB = new QToolButton;                     // 第一个控件，画点
    EllipseTB->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);        // 控件样式设计为文本显示在图标下方
    EllipseTB->setFixedSize(QSize(100,72));                         // 指定图标的大小为 32x32 像素
    EllipseTB->setText("椭圆");                                  // 同时也设置了控件的显示名称
    EllipseTB->setArrowType(Qt::NoArrow);                         // 设置为没有箭头显示
    const QIcon EllipseIcon = QIcon::fromTheme("Ellipse", QIcon(":/icons/icons/Ellipse.ico")); // 资源文件中的图标
    EllipseTB->setIcon(EllipseIcon);                                // 把这个点的图标设置给QToolButton按钮
    connect(EllipseTB,&QToolButton::clicked,this,&MainWindow::EllipseTB_clicked);   // 建立点击该按钮的槽函数的链接
    drawHL1->addWidget(EllipseTB);

    QToolButton *CurveTB = new QToolButton;                     // 第一个控件，画点
    CurveTB->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);        // 控件样式设计为文本显示在图标下方
    CurveTB->setFixedSize(QSize(100,72));                         // 指定图标的大小为 32x32 像素
    CurveTB->setText("曲线");                                  // 同时也设置了控件的显示名称
    CurveTB->setArrowType(Qt::NoArrow);                         // 设置为没有箭头显示
    const QIcon CurveIcon = QIcon::fromTheme("Curve", QIcon(":/icons/icons/Curve.ico")); // 资源文件中的图标
    CurveTB->setIcon(CurveIcon);                                // 把这个点的图标设置给QToolButton按钮
    connect(CurveTB,&QToolButton::clicked,this,&MainWindow::CurveTB_clicked);   // 建立点击该按钮的槽函数的链接
    drawHL1->addWidget(CurveTB);

    QToolButton *TextTB = new QToolButton;                     // 第一个控件，画点
    TextTB->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);        // 控件样式设计为文本显示在图标下方
    TextTB->setFixedSize(QSize(100,72));                         // 指定图标的大小为 32x32 像素
    TextTB->setText("文本");                                  // 同时也设置了控件的显示名称
    TextTB->setArrowType(Qt::NoArrow);                         // 设置为没有箭头显示
    const QIcon TextIcon = QIcon::fromTheme("Text", QIcon(":/icons/icons/Text tool.ico")); // 资源文件中的图标
    TextTB->setIcon(TextIcon);                                // 把这个点的图标设置给QToolButton按钮
    connect(TextTB,&QToolButton::clicked,this,&MainWindow::TextTB_clicked);   // 建立点击该按钮的槽函数的链接
    drawHL1->addWidget(TextTB);

    QToolButton *SquareTB = new QToolButton;                     // 第一个控件，画点
    SquareTB->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);        // 控件样式设计为文本显示在图标下方
    SquareTB->setFixedSize(QSize(100,72));                         // 指定图标的大小为 32x32 像素
    SquareTB->setText("图块");                                  // 同时也设置了控件的显示名称
    SquareTB->setArrowType(Qt::NoArrow);                         // 设置为没有箭头显示
    const QIcon SquareIcon = QIcon::fromTheme("Square", QIcon(":/icons/icons/Square.ico")); // 资源文件中的图标
    SquareTB->setIcon(SquareIcon);                                // 把这个点的图标设置给QToolButton按钮
    connect(SquareTB,&QToolButton::clicked,this,&MainWindow::SquareTB_clicked);   // 建立点击该按钮的槽函数的链接
    drawHL1->addWidget(SquareTB);

    QToolButton *TransparentTB = new QToolButton;                     // 第一个控件，画点
    TransparentTB->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);        // 控件样式设计为文本显示在图标下方
    TransparentTB->setFixedSize(QSize(100,72));                         // 指定图标的大小为 32x32 像素
    TransparentTB->setText("图块");                                  // 同时也设置了控件的显示名称
    TransparentTB->setArrowType(Qt::NoArrow);                         // 设置为没有箭头显示
    const QIcon TransparentIcon = QIcon::fromTheme("Transparent", QIcon(":/icons/icons/Transparent color.ico")); // 资源文件中的图标
    TransparentTB->setIcon(TransparentIcon);                                // 把这个点的图标设置给QToolButton按钮
    connect(TransparentTB,&QToolButton::clicked,this,&MainWindow::TransparentTB_clicked);   // 建立点击该按钮的槽函数的链接
    drawHL1->addWidget(TransparentTB);

    QToolButton *AngleTB = new QToolButton;                     // 第一个控件，画点
    AngleTB->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);        // 控件样式设计为文本显示在图标下方
    AngleTB->setFixedSize(QSize(100,72));                         // 指定图标的大小为 32x32 像素
    AngleTB->setText("折线");                                  // 同时也设置了控件的显示名称
    AngleTB->setArrowType(Qt::NoArrow);                         // 设置为没有箭头显示
    const QIcon AngleIcon = QIcon::fromTheme("Angle", QIcon(":/icons/icons/Angle.ico")); // 资源文件中的图标
    AngleTB->setIcon(AngleIcon);                                // 把这个点的图标设置给QToolButton按钮
    connect(AngleTB,&QToolButton::clicked,this,&MainWindow::AngleTB_clicked);   // 建立点击该按钮的槽函数的链接
    drawHL1->addWidget(AngleTB);

    QToolButton *LeftrightTB = new QToolButton;                     // 第一个控件，画点
    LeftrightTB->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);        // 控件样式设计为文本显示在图标下方
    LeftrightTB->setFixedSize(QSize(100,72));                         // 指定图标的大小为 32x32 像素
    LeftrightTB->setText("尺寸");                                  // 同时也设置了控件的显示名称
    LeftrightTB->setArrowType(Qt::NoArrow);                         // 设置为没有箭头显示
    const QIcon LeftrightIcon = QIcon::fromTheme("Leftright", QIcon(":/icons/icons/Left-right.ico")); // 资源文件中的图标
    LeftrightTB->setIcon(LeftrightIcon);                                // 把这个点的图标设置给QToolButton按钮
    connect(LeftrightTB,&QToolButton::clicked,this,&MainWindow::LeftrightTB_clicked);   // 建立点击该按钮的槽函数的链接
    drawHL1->addWidget(LeftrightTB);

    // 下面是圆的菜单项添加，圆分中心半径、两点、三点画圆等方法，因此需要多图标重叠
    QToolButton *circleTB =new QToolButton;
    circleTB->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);        // 控件样式设计为文本显示在图标下方
    circleTB->setIconSize(QSize(32,32));                         // 指定图标的大小为 32x32 像素
    circleTB->setText("圆");                                  // 同时也设置了控件的显示名称
    circleTB->setArrowType(Qt::NoArrow);                         // 设置为没有箭头显示
    circleTB->setPopupMode(QToolButton::MenuButtonPopup);
    const QIcon circleIcon = QIcon::fromTheme("Circle", QIcon(":/icons/icons/Circle.ico"));   // 这是资源文件中的图标
    circleTB->setIcon(circleIcon);                                // 把这个点的图标设置给QToolButton按钮

    QMenu * circleMenu = new QMenu;               // 为以叠加图标，需要构建菜单再添加动作
    QAction * cirAct1 = new QAction(QIcon(":/icons/icons/Circle.ico"),"圆心半径");
    QAction * cirAct2 = new QAction(QIcon(":/icons/icons/Circle.ico"),"两点画圆");
    QAction * cirAct3 = new QAction(QIcon(":/icons/icons/Circle.ico"),"三点画圆");
    circleMenu->addAction(cirAct1);
    circleMenu->addAction(cirAct2);
    circleMenu->addAction(cirAct3);
    circleTB->setMenu(circleMenu);              		// 把菜单添加到QToolButton
    connect(cirAct1,&QAction::triggered,this,&MainWindow::on_actioncirAct1_triggered);
    drawHL1->addWidget(circleTB);

    QToolButton *ArcTB =new QToolButton;
    ArcTB->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);        // 控件样式设计为文本显示在图标下方
    ArcTB->setIconSize(QSize(32,32));                         // 指定图标的大小为 32x32 像素
    ArcTB->setText("圆弧");                                  // 同时也设置了控件的显示名称
    ArcTB->setArrowType(Qt::NoArrow);                         // 设置为没有箭头显示
    ArcTB->setPopupMode(QToolButton::MenuButtonPopup);
    const QIcon ArcIcon = QIcon::fromTheme("Arc", QIcon(":/icons/icons/Arc.ico"));   // 这是资源文件的图标
    ArcTB->setIcon(ArcIcon);                                // 把这个点的图标设置给QToolButton按钮

    QMenu * ArcMenu = new QMenu;               // 为以叠加图标，需要构建菜单再添加动作
    QAction * ArcAct1 = new QAction(QIcon(":/icons/icons/Arc.ico"),"圆心半径");
    QAction * ArcAct2 = new QAction(QIcon(":/icons/icons/Arc.ico"),"两点画弧");
    QAction * ArcAct3 = new QAction(QIcon(":/icons/icons/Arc.ico"),"三点画弧");
    ArcMenu->addAction(ArcAct1);
    ArcMenu->addAction(ArcAct2);
    ArcMenu->addAction(ArcAct3);
    ArcTB->setMenu(ArcMenu);              		// 把菜单添加到QToolButton
    connect(ArcAct1,&QAction::triggered,this,&MainWindow::on_actionArcAct1_triggered);
    drawHL1->addWidget(ArcTB);


    // 为了布局DrawTab中的图标，再创建一个总的横向布局，把前面的三个布局都添加进来，
    QHBoxLayout *drawHL = new QHBoxLayout;
    drawHL->setAlignment(Qt::AlignLeft);
    drawHL->setAlignment(Qt::AlignTop);
    drawHL->setContentsMargins(0,0,0,0);

    drawHL->addLayout(drawHL1);

    // 最后，把DrawTab的布局设计成刚才创建的布局
    ui->DrawTab->setLayout(drawHL);

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_actionExit_triggered()
{
    // 退出程序之前，需要检查文件是否保存，我们将在以后的学习中添加代码
    this->close();   //  退出窗口应用程序

}


void MainWindow::on_actionNew_triggered()
{
    //新建一个文件，也就是要把主链表清空，但在此之前，提示用户是否保存
    int ret = QMessageBox::warning(this, "Warning","你的图形是否保存?",QMessageBox::Ok | QMessageBox::Cancel);
    if(ret == QMessageBox::Ok)
        m_mainlist.clear();

}


void MainWindow::on_actionOpen_triggered()
{
    // 打开一个文件之前，也需要判断是否保存当前文件，我们将在以后的学习中添加
    QString curPath = QDir::currentPath();   // 获得当前程序所在的目录
    QString aFileName = QFileDialog::getOpenFileName(this,"选择一个图形文件",curPath,"CAD文件(*.*)");
    if(!aFileName.isEmpty())
        qDebug()<<"把文件内容读入到m_MainList中";

}


void MainWindow::on_actionSave_triggered()
{
    // 保存一个文件
    QString curPath = QDir::currentPath();
    QString aFileName = QFileDialog::getSaveFileName(this,"输入一个图形文件名称",curPath,"CAD文件(*.*)");
    if(!aFileName.isEmpty())
        qDebug()<<"把m_MainList中的对象写入到 : "<< aFileName;

}


void MainWindow::on_actionSaveAs_triggered()
{
    // 另存一个文件
    QString curPath = QDir::currentPath();
    QString aFileName = QFileDialog::getSaveFileName(this,"输入一个图形文件名称",curPath,"CAD文件(*.*)");
    if(!aFileName.isEmpty())
        qDebug()<<"把m_MainList中的对象写入到 : "<< aFileName;

}

void MainWindow::on_actioncirAct1_triggered()
{

}

void MainWindow::on_actionArcAct1_triggered()
{

}

void MainWindow::pointTB_clicked()
{
    curDrawType = DPoint;
}

void MainWindow::lineTB_clicked()
{
    curDrawType = DLine;
}

void MainWindow::rectangleTB_clicked()
{
    curDrawType = DRectangle;
}

void MainWindow::EllipseTB_clicked()
{

}

void MainWindow::CurveTB_clicked()
{

}

void MainWindow::TextTB_clicked()
{

}

void MainWindow::SquareTB_clicked()
{

}

void MainWindow::TransparentTB_clicked()
{

}

void MainWindow::AngleTB_clicked()
{

}

void MainWindow::LeftrightTB_clicked()
{

}



